home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_09_02 / 9n02087a < prev    next >
Text File  |  1990-12-16  |  4KB  |  98 lines

  1.  
  2. /*
  3.  *    10-Oct-1990 - created
  4.  */
  5.  
  6. /***********************************************************
  7.  *
  8.  *    Module:   _olist.h
  9.  *
  10.  *    Purpose:  Private include file for olist.c
  11.  *
  12.  *    (c) Copyright 1990 Kenneth L. Grogan Jr.
  13.  *
  14.  **********************************************************/
  15.  
  16.  
  17. #ifndef _OLIST_H
  18. #define _OLIST_H
  19.                                 /* for maximum double value */
  20. #include "float.h"
  21.  
  22. #define MIN_KEY         0
  23. #define MAX_KEY         (OLIST_NUM_KEY_TYPES - 1)
  24.  
  25. #define KEY_1_MAX       UINT_MAX
  26. #define KEY_2_MAX       DBL_MAX
  27. #define KEY_3_MAX       NULL
  28.                                 /* for double equality test */
  29. #define TOLERANCE       3e-8
  30.                                 /* set maximum key values */
  31. #define SET_MAXIMUM_KEY_VALUES()                        \
  32.     max_key_value[OLIST_KEY_1].key_1 = KEY_1_MAX;       \
  33.     max_key_value[OLIST_KEY_2].key_2 = KEY_2_MAX;       \
  34.     max_key_value[OLIST_KEY_3].key_3 = KEY_3_MAX
  35.                                 /* get appropriate key type */
  36. #define GET_KEY(key, type, key_ptr)             \
  37.     if ((type) == OLIST_KEY_1)                  \
  38.         (key).key_1 = *((KEY_1_T *)(key_ptr));  \
  39.     else if ((type) == OLIST_KEY_2)             \
  40.         (key).key_2 = *((KEY_2_T *)(key_ptr));  \
  41.     else                                        \
  42.         (key).key_3 = *((KEY_3_T *)(key_ptr))
  43.                            /* set appropriate key type */
  44. #define SET_KEY(key, type, key_ptr)             \
  45.     if ((key_ptr) != NULL)                      \
  46.         if ((type) == OLIST_KEY_1)              \
  47.             *((KEY_1_T *)(key_ptr)) = (key).key_1;\
  48.         else if ((type) == OLIST_KEY_2)           \
  49.             *((KEY_2_T *)(key_ptr)) = (key).key_2;\
  50.         else                                      \
  51.             *((KEY_3_T *)(key_ptr)) = (key).key_3
  52.                            /* key >= Maximum key value? */
  53. #define KEY_IS_INVALID(sl, type, key_ptr)       \
  54.     ((type) != (sl)->key_type ? TRUE :          \
  55.         ((type) == OLIST_KEY_1 ?                \
  56.             *((KEY_1_T *)(key_ptr)) >= UINT_MAX : \
  57.             ((type) == OLIST_KEY_2 ?            \
  58.                 *((KEY_2_T *)(key_ptr)) >= DBL_MAX : \
  59.                 *((KEY_3_T *)(key_ptr)) == NULL)))
  60.  
  61.                                 /* key_a == key_b */
  62. #define KEY_EQ(sl, key_a, key_b)                    \
  63.     ((sl)->key_type == OLIST_KEY_1 ?                \
  64.         (key_a).key_1 == (key_b).key_1 :            \
  65.         ((sl)->key_type == OLIST_KEY_2 ?            \
  66.             fabs((key_a).key_2 - (key_b).key_2) <= TOLERANCE :\
  67.             ((key_a).key_3 == NULL ? 0 :            \
  68.                 ((*((sl)->compare_func))((key_a).key_3, \
  69.                                         (key_b).key_3)) == 0)))
  70.  
  71.                                 /* key_a < key_b */
  72. #define KEY_LT(sl, key_a, key_b)                \
  73.     ((sl)->key_type == OLIST_KEY_1 ?            \
  74.         (key_a).key_1 < (key_b).key_1 :         \
  75.         ((sl)->key_type == OLIST_KEY_2 ?        \
  76.             (key_a).key_2 < (key_b).key_2 :     \
  77.             ((key_a).key_3 == NULL ? 0 :        \
  78.                 ((*((sl)->compare_func))((key_a).key_3, \
  79.                                         (key_b).key_3)) < 0)))
  80.  
  81.                                 /* key data types */
  82. typedef uint    KEY_1_T;
  83. typedef double  KEY_2_T;
  84. typedef void    *KEY_3_T;
  85.  
  86. typedef union
  87. {
  88.     KEY_1_T     key_1;
  89.     KEY_2_T     key_2;
  90.     KEY_3_T     key_3;
  91. } SL_KEY;
  92.  
  93. #endif   /* _OLIST_H */
  94.  
  95. /*
  96.  *    end of file
  97.  */
  98.